﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace SST_DA
{
    public class HorarioDA
    {

        /// <summary>
        /// Lista todos los horaros no eliminados
        /// </summary>
        /// <returns>un Horario[] con todos los horarios disponibles</returns>
        public static Horario[] ListarHorarios() {
            const string query = "SELECT HorarioID, NombreHorario, HoraInicio, HoraFin, Dias"
                                +" FROM Horario WHERE FechaBorrado IS NULL";
            object[] parametros = { };
            string[] nombreParametros = { };
            DataTable result =  BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            Horario[] horarios = new Horario[result.Rows.Count];
            for(int i = 0; i < result.Rows.Count; i++){
                bool[] diasConFormato = DiasStringToBool(result.Rows[i].ItemArray[4].ToString());//Dias en formato LKMJVSD o L00000D
                horarios[i] = new Horario(int.Parse(result.Rows[i].ItemArray[0].ToString()),
                                          result.Rows[i].ItemArray[1].ToString(),
                                          int.Parse(result.Rows[i].ItemArray[2].ToString()),
                                          int.Parse(result.Rows[i].ItemArray[3].ToString()),
                                          diasConFormato
                );
            }
            return horarios;
        }

        /// <summary>
        /// Busca un horario en la base de datos.
        /// </summary>
        /// <param name="ID">El ID de el horario a buscar</param>
        /// <returns>El horario en base al ID proporcionado</returns>
        public static Horario GetHorario(int ID) {
            const string query =  "exec GetHorario @HorarioID";
            object[] parametros = { ID };
            string[] nombreParametros = { "@HorarioID" };
            DataTable result = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return null;
            return new Horario(
                int.Parse(result.Rows[0].ItemArray[0].ToString()),
                result.Rows[0].ItemArray[1].ToString(),
                int.Parse(result.Rows[0].ItemArray[2].ToString()),
                int.Parse(result.Rows[0].ItemArray[3].ToString()),
                DiasStringToBool(result.Rows[0].ItemArray[4].ToString())
                );
        }

        /// <summary>
        /// Pasa del formato de dias LKMJVSD a un bool[]
        /// </summary>
        /// <param name="dias">String de dias en formato LKMJVSD</param>
        /// <returns>Un bool[] en base al string proporcionado</returns>
        private static bool[] DiasStringToBool(string dias) {
            char[] diasSinFormato = dias.ToCharArray(0, 7); //Dias en formato LKMJVSD o L00000D
            bool[] diasConFormato = new bool[7];
            for (int j = 0; j < diasSinFormato.Length; j++)
            {
                if (diasSinFormato[j].Equals('0'))
                    diasConFormato[j] = false;
                else
                    diasConFormato[j] = true;
            }
            return diasConFormato;
        }

        private static string BoolToDiasString(bool[] diasSinFormato) {
            string diasConFormato = "";
            for(int i = 0; i < diasSinFormato.Length; i++)
                if (diasSinFormato[i] == true)
                {
                    switch (i)
                    {
                        case 0:
                                diasConFormato += "L";
                            break;
                        case 1:
                                diasConFormato += "K";
                            break;
                        case 2:
                                diasConFormato += "M";
                            break;
                        case 3:
                                diasConFormato += "J";
                            break;
                        case 4:
                                diasConFormato += "V";
                            break;
                        case 5:
                                diasConFormato += "S";
                            break;
                        case 6:
                                diasConFormato += "D";
                            break;
                    }//switch
                }
                else {
                    diasConFormato += '0';
                }
            return diasConFormato;  
        }

        public static bool AgregarHorario(Horario h) { 
            const string query = "exec AgregarHorario @NombreHorario, @HoraInicio, @HoraFin, @Dias";
            string[] nombreParametros = new string[] { "@NombreHorario", "@HoraInicio", "@HoraFin", "@Dias" };
            object[] parametros = new object[]{ h.NombreHorario, h.HoraInicio, h.HoraFin, BoolToDiasString(h.Dias) };               
            DataTable result = BaseDatos.ExecuteQuery( query, nombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0)
                return true;
            return false;
        }

        public static bool EditarHorario(Horario h) {
            const string query = "exec EditarHorario @HorarioID, @NombreHorario, @HoraInicio, @HoraFin, @Dias";
            string[] nombreParametros = new string[] {"@HorarioID", "@NombreHorario", "@HoraInicio", "@HoraFin", "@Dias" };
            object[] parametros = new object[] { h.HorarioID,  h.NombreHorario, h.HoraInicio, h.HoraFin, BoolToDiasString(h.Dias) };
            DataTable result = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0)
                return true;
            return false;
        }

        public static bool EliminarHorario( int HorarioID) {
            const string query = "exec EliminarHorario @HorarioID";
            string[] nombreParametros = new string[] { "@HorarioID" };
            object[] parametros = new object[] { HorarioID };
            DataTable result = BaseDatos.ExecuteQuery(query, nombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0)
                return true;
            return false;
        }

    }//class HorarioDA
}//namespace SST_DA
